import { defineConfig, ConfigEnv, loadEnv, Plugin } from 'vite';
import uni from "@dcloudio/vite-plugin-uni";
import AutoImport from "unplugin-auto-import/vite";

// 微信小程序兼容性处理 - 在构建时注入基础配置
const mpWeixinDefine = {
  // 在全局作用域中注入__wxConfig对象，解决onLoad阶段访问问题
  '__wxConfig': JSON.stringify({
    useWebWorker: false
  })
};

// Babel配置 - 用于处理可选链操作符等ES6+特性的兼容性
const babelPlugins = [
  // 处理可选链操作符 ?
  '@babel/plugin-proposal-optional-chaining'
];

export default defineConfig(async ({ mode }: ConfigEnv): Promise<{
  server: {
    proxy: { [p: string]: { changeOrigin: boolean; rewrite: (path) => any; target: string } };
    port: number;
    host: string;
    open: boolean
  };
  uni: { h5: { externals: { d3: string }; script: string[] } };
  plugins: (Plugin[] | any)[]
}> => {
  const UnoCss = await import("unocss/vite").then((i) => i.default);
  const env = loadEnv(mode, process.cwd());

  return {
    server: {
      host: "0.0.0.0",
      port: +env.VITE_APP_PORT,
      open: true,
      // 代理配置只在 H5（浏览器）开发时生效。 其他平台（如小程序、App）在开发时不使用 Vite 的开发服务器，它们直接运行在各自的环境中。
      proxy: {
        [env.VITE_APP_BASE_API]: {
          changeOrigin: true,
          target: env.VITE_APP_API_URL,
          rewrite: (path) => path.replace(new RegExp("^" + env.VITE_APP_BASE_API), ""),
        },
        // 新增：代理 /static/uploads/ 到本地 8989 端口
        "/static/uploads/": {
          target: "http://192.168.0.185:8989",
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/static\/uploads\//, "/static/uploads/"),
        },
      },
    },
    // 全局常量定义，在构建时替换代码中的变量
    define: {
      // 为所有环境定义基础配置
      ...mpWeixinDefine
    },
    
    // 路径别名配置 - 解决@babel/runtime/helpers/regeneratorValues模块未定义问题和Vant Weapp组件解析问题
    resolve: {
      alias: {
        // 将@babel/runtime/helpers/regeneratorValues重定向到自定义polyfill
        '@babel/runtime/helpers/regeneratorValues': 
          '/src/utils/regeneratorValuesPolyfill.js',
        // 配置@vant/weapp路径别名，指向正确的dist目录
        '@vant/weapp': '/node_modules/@vant/weapp/dist'
      },
      // 添加文件扩展名支持，确保正确解析组件文件
      extensions: ['.js', '.vue', '.ts', '.d.ts']
    },
    
    plugins: [
      // https://github.com/unocss/unocss
      UnoCss(),

      AutoImport({
        imports: ["vue", "uni-app"],
        dts: "src/types/auto-imports.d.ts", // 自动生成的类型声明文件
        eslintrc: {
          enabled: false,
        },
      }),
      uni({
        // 添加babel配置以处理可选链操作符等ES6+特性的兼容性
        babel: {
          plugins: babelPlugins
        }
      }),
    ],
    
    uni: {
      h5: {
        externals: {
          'd3': 'window.d3' // 将 d3 模块映射到全局 window.d3 对象
        },
        script: [
          // 通过 CDN 引入 D3 脚本（生产环境和开发环境均可使用）
          'https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js'
        ]
      },
      // 微信小程序平台特定配置
      'mp-weixin': {
        // 配置微信小程序特有选项
        define: {
          // 微信小程序环境下的额外定义
          ...mpWeixinDefine
        },
        // 构建时可以添加的其他微信小程序特定配置
      }
    }
  };
});
